home *** CD-ROM | disk | FTP | other *** search
/ Delphi 5 for Professionals / DELPHI5.iso / AddOns / Components / Orpheus v3.02 / SETUP.EXE / %MAINDIR% / OvcState.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-02-25  |  19.9 KB  |  808 lines

  1. {*********************************************************}
  2. {*                  OVCSTATE.PAS 3.00                    *}
  3. {*     Copyright (c) 1995-99 TurboPower Software Co      *}
  4. {*                 All rights reserved.                  *}
  5. {*********************************************************}
  6.  
  7. {$I OVC.INC}
  8.  
  9. {$B-} {Complete Boolean Evaluation}
  10. {$I+} {Input/Output-Checking}
  11. {$P+} {Open Parameters}
  12. {$T-} {Typed @ Operator}
  13. {$W-} {Windows Stack Frame}
  14. {$X+} {Extended Syntax}
  15.  
  16. {$IFNDEF Win32}
  17. {$G+} {286 Instructions}
  18. {$N+} {Numeric Coprocessor}
  19.  
  20. {$C MOVEABLE,DEMANDLOAD,DISCARDABLE}
  21. {$ENDIF}
  22.  
  23. unit OvcState;
  24.   {-component to save and restore the form state}
  25.  
  26. interface
  27.  
  28. uses
  29.   {$IFDEF Win32} Windows, Registry, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  30.   Classes, Controls, IniFiles, Forms, Messages, SysUtils,
  31.   OvcBase, OvcData, OvcMisc, OvcFiler;
  32.  
  33. type
  34.   TOvcFormStateOption  = (fsState, fsPosition, fsActiveControl
  35.        {$IFDEF VERSION4}, fsDefaultMonitor{$ENDIF});
  36.   TOvcFormStateOptions = set of TOvcFormStateOption;
  37.  
  38. type
  39.   TOvcAbstractState = class(TOvcComponent)
  40.   {.Z+}
  41.   protected {private}
  42.     {property variables}
  43.     FActive             : Boolean;
  44.     FSection            : string;
  45.     FStorage            : TOvcAbstractStore;
  46.  
  47.     {event variables}
  48.     FOnSaveState        : TNotifyEvent;
  49.     FOnRestoreState     : TNotifyEvent;
  50.  
  51.     {internal variables}
  52.     isDestroying         : Boolean;
  53.     isRestored           : Boolean;
  54.     isSaved              : Boolean;
  55.     isSaveFormCreate     : TNotifyEvent;
  56.     isSaveFormDestroy    : TNotifyEvent;
  57.     isSaveFormCloseQuery : TCloseQueryEvent;
  58.  
  59.     {property methods}
  60.     function GetForm : TCustomForm;
  61.     function GetSection : string;
  62.     procedure SetStorage(Value : TOvcAbstractStore);
  63.  
  64.     {internal methods}
  65.     procedure FormCloseQuery(Sender : TObject; var CanClose : Boolean);
  66.     procedure FormCreate(Sender : TObject);
  67.     procedure FormDestroy(Sender : TObject);
  68.     procedure RestoreEvents;
  69.  
  70.   protected
  71.     procedure Loaded;
  72.       override;
  73.     procedure Notification(AComponent : TComponent; Operation : TOperation);
  74.       override;
  75.  
  76.     procedure DoOnRestoreState;
  77.       dynamic;
  78.     procedure DoOnSaveState;
  79.       dynamic;
  80.  
  81.     procedure RestoreStatePrim;
  82.       virtual; abstract;
  83.     procedure SaveStatePrim;
  84.       virtual; abstract;
  85.     procedure SetEvents;
  86.       dynamic;
  87.  
  88.     property Form : TCustomForm
  89.       read GetForm;
  90.   {.Z-}
  91.  
  92.     {properties}
  93.     property Active : Boolean
  94.       read FActive write FActive;
  95.     property Section : string
  96.       read GetSection write FSection;
  97.     property Storage : TOvcAbstractStore
  98.       read FStorage write SetStorage;
  99.  
  100.     {events}
  101.     property OnSaveState : TNotifyEvent
  102.       read FOnSaveState write FOnSaveState;
  103.  
  104.     property OnRestoreState : TNotifyEvent
  105.       read FOnRestoreState write FOnRestoreState;
  106.  
  107.   public
  108.   {.Z+}
  109.     constructor Create(AOwner : TComponent);
  110.       override;
  111.     destructor Destroy;
  112.       override;
  113.   {.Z-}
  114.  
  115.     procedure RestoreState;
  116.     procedure SaveState;
  117.   end;
  118.  
  119.   TOvcFormState = class(TOvcAbstractState)
  120.   {.Z+}
  121.   protected {private}
  122.     {property variables}
  123.     FOptions     : TOvcFormStateOptions;
  124.  
  125.     {internal variables}
  126.     FDefMaximize : Boolean;
  127.  
  128.     {internal methods}
  129.     procedure UpdateFormState;
  130.     procedure ReadFormState(Form : TCustomForm; const Section : string;
  131.               LoadState, LoadPosition : Boolean);
  132.     procedure WriteFormState(Form : TCustomForm; const Section : string);
  133.  
  134.   protected
  135.     procedure RestoreStatePrim;
  136.       override;
  137.     procedure SaveStatePrim;
  138.       override;
  139.  
  140.   public
  141.     constructor Create(AOwner : TComponent);
  142.       override;
  143.   {.Z-}
  144.  
  145.   published
  146.     {properties}
  147.     property Active;
  148.     property Options : TOvcFormStateOptions
  149.       read FOptions write FOptions;
  150.     property Section;
  151.     property Storage;
  152.  
  153.     {events}
  154.     property OnSaveState;
  155.     property OnRestoreState;
  156.   end;
  157.  
  158.   TOvcComponentState = class(TOvcAbstractState)
  159.   {.Z+}
  160.   protected {private}
  161.     {property variables}
  162.     FStoredProperties : TStrings;
  163.  
  164.     procedure SetStoredProperties(Value : TStrings);
  165.  
  166.   protected
  167.     procedure Loaded;
  168.       override;
  169.     procedure Notification(AComponent : TComponent; Operation : TOperation);
  170.       override;
  171.     procedure RestoreStatePrim;
  172.       override;
  173.     procedure SaveStatePrim;
  174.       override;
  175.     procedure WriteState(Writer: TWriter);
  176.       override;
  177.  
  178.   public
  179.     constructor Create(AOwner: TComponent);
  180.       override;
  181.     destructor Destroy;
  182.       override;
  183.     procedure SetNotification;
  184.   {.Z-}
  185.  
  186.   published
  187.     {properties}
  188.     property Active;
  189.     property Section;
  190.     property Storage;
  191.     property StoredProperties : TStrings
  192.       read FStoredProperties write SetStoredProperties;
  193.  
  194.     {events}
  195.     property OnSaveState;
  196.     property OnRestoreState;
  197.   end;
  198.  
  199.   TOvcPersistentState = class(TOvcComponent)
  200.   {.Z+}
  201.   protected {private}
  202.     {property variables}
  203.     FStorage : TOvcAbstractStore;
  204.  
  205.     {property methods}
  206.     procedure SetStorage(Value : TOvcAbstractStore);
  207.  
  208.   protected
  209.     procedure Notification(AComponent : TComponent; Operation : TOperation);
  210.       override;
  211.   {.Z-}
  212.  
  213.   public
  214.     procedure RestoreState(AnObject : TPersistent; const ASection : string);
  215.     procedure SaveState(AnObject : TPersistent; const ASection : string);
  216.  
  217.   published
  218.     {properties}
  219.     property Storage : TOvcAbstractStore
  220.       read FStorage write SetStorage;
  221.   end;
  222.  
  223.  
  224. implementation
  225.  
  226.  
  227. const
  228.   cActiveCtrl = 'ActiveControl';
  229.   cFlags      = 'Flags';
  230.   cItem       = 'Item%d';
  231.   cListCount  = 'Count';
  232.   cMDIChild   = 'MDI Children';
  233.   cNormPos    = 'NormalPos';
  234.   cShowCmd    = 'ShowCmd';
  235.   cMonitor    = 'DefaultMonitor';
  236.  
  237.  
  238. {*** utility routines ***}
  239.  
  240. function GetDefaultSection(Component : TComponent) : string;
  241. var
  242.   F     : TForm;
  243.   Owner : TComponent;
  244. begin
  245.   if Component <> nil then begin
  246.     if Component is TCustomForm then
  247.       Result := Component.ClassName
  248.     else begin
  249.       Result := Component.Name;
  250.       if Component is TControl then begin
  251.         F := TForm(GetParentForm(TControl(Component)));
  252.         if F <> nil then
  253.           Result := F.ClassName + Result
  254.         else begin
  255.           if TControl(Component).Parent <> nil then
  256.             Result := TControl(Component).Parent.Name + Result;
  257.         end;
  258.       end else begin
  259.         Owner := Component.Owner;
  260.         if Owner is TCustomForm then
  261.           Result := Format('%s.%s', [Owner.ClassName, Result]);
  262.       end;
  263.     end;
  264.   end else
  265.     Result := '';
  266. end;
  267.  
  268.  
  269. {*** TOvcAbstractState ***}
  270.  
  271. constructor TOvcAbstractState.Create(AOwner : TComponent);
  272. begin
  273.   inherited Create(AOwner);
  274.  
  275.   FActive := True;
  276. end;
  277.  
  278. destructor TOvcAbstractState.Destroy;
  279. begin
  280.   if not (csDesigning in ComponentState) then
  281.     RestoreEvents;
  282.  
  283.   inherited Destroy;
  284. end;
  285.  
  286. procedure TOvcAbstractState.DoOnSaveState;
  287. begin
  288.   if Assigned(FOnSaveState) then
  289.     FOnSaveState(Self);
  290. end;
  291.  
  292. procedure TOvcAbstractState.DoOnRestoreState;
  293. begin
  294.   if Assigned(FOnRestoreState) then
  295.     FOnRestoreState(Self);
  296. end;
  297.  
  298. procedure TOvcAbstractState.FormCloseQuery(Sender : TObject; var CanClose : Boolean);
  299. begin
  300.   if Assigned(isSaveFormCloseQuery) then
  301.     isSaveFormCloseQuery(Sender, CanClose);
  302.  
  303.   if CanClose and Active and (Form.Handle <> 0) then
  304.     try
  305.       SaveState;
  306.     except
  307.       Application.HandleException(Self);
  308.     end;
  309. end;
  310.  
  311. procedure TOvcAbstractState.FormCreate(Sender : TObject);
  312. begin
  313.   {call original OnCreate event for form}
  314.   if Assigned(isSaveFormCreate) then
  315.     isSaveFormCreate(Sender);
  316.  
  317.   if Active then begin
  318.     try
  319.       RestoreState;
  320.     except
  321.       Application.HandleException(Self);
  322.     end;
  323.   end;
  324. end;
  325.  
  326. procedure TOvcAbstractState.FormDestroy(Sender : TObject);
  327. begin
  328.   if Active and not isSaved then begin
  329.     isDestroying := True;
  330.     try
  331.       SaveState;
  332.     except
  333.       Application.HandleException(Self);
  334.     end;
  335.     isDestroying := False;
  336.   end;
  337.  
  338.   if Assigned(isSaveFormDestroy) then
  339.     isSaveFormDestroy(Sender);
  340. end;
  341.  
  342. function TOvcAbstractState.GetForm : TCustomForm;
  343. begin
  344.   Result := Owner as TCustomForm;
  345. end;
  346.  
  347. function TOvcAbstractState.GetSection : string;
  348. begin
  349.   if FSection > '' then
  350.     Result := FSection
  351.   else
  352.     Result := GetDefaultSection(Owner);
  353. end;
  354.  
  355. procedure TOvcAbstractState.Loaded;
  356. var
  357.   WasLoading : Boolean;
  358. begin
  359.   WasLoading := csLoading in ComponentState;
  360.  
  361.   inherited Loaded;
  362.  
  363.   if not (csDesigning in ComponentState) then
  364.     if WasLoading then
  365.       SetEvents;
  366. end;
  367.  
  368. procedure TOvcAbstractState.Notification(AComponent : TComponent; Operation : TOperation);
  369. begin
  370.   inherited Notification(AComponent, Operation);
  371.  
  372.   if Operation = opRemove then
  373.     if (AComponent = FStorage) then begin
  374.       FActive := False;
  375.       FStorage := nil;
  376.     end;
  377. end;
  378.  
  379. procedure TOvcAbstractState.RestoreState;
  380. begin
  381.   isSaved := False;
  382.   RestoreStatePrim;
  383.   isRestored := True;
  384.   DoOnRestoreState;
  385. end;
  386.  
  387. procedure TOvcAbstractState.SaveState;
  388. begin
  389.   if isRestored or not Active then begin
  390.     SaveStatePrim;
  391.     DoOnSaveState;
  392.     isSaved := True;
  393.   end;
  394. end;
  395.  
  396. procedure TOvcAbstractState.RestoreEvents;
  397. begin
  398.   if Owner <> nil then
  399.     with TForm(Form) do begin
  400.       OnCreate := isSaveFormCreate;
  401.       OnCloseQuery := isSaveFormCloseQuery;
  402.       OnDestroy := isSaveFormDestroy;
  403.     end;
  404. end;
  405.  
  406. procedure TOvcAbstractState.SetEvents;
  407. begin
  408.   with TForm(Form) do begin
  409.     isSaveFormCreate := OnCreate;
  410.     OnCreate := FormCreate;
  411.     isSaveFormCloseQuery := OnCloseQuery;
  412.     OnCloseQuery := FormCloseQuery;
  413.     isSaveFormDestroy := OnDestroy;
  414.     OnDestroy := FormDestroy;
  415.   end;
  416. end;
  417.  
  418. procedure TOvcAbstractState.SetStorage(Value : TOvcAbstractStore);
  419. begin
  420.   FStorage := Value;
  421.   {$IFDEF Win32}
  422.   if Value <> nil then
  423.     Value.FreeNotification(Self);
  424.   {$ENDIF}
  425. end;
  426.  
  427.  
  428. {*** TOvcFormState ***}
  429.  
  430. constructor TOvcFormState.Create(AOwner : TComponent);
  431. begin
  432.   inherited Create(AOwner);
  433.  
  434.   if AOwner is TCustomForm then
  435.     FOptions := [fsState, fsPosition]
  436.   else
  437.     FOptions := [];
  438. end;
  439.  
  440. {$IFDEF WIN32}
  441.   {$HINTS OFF}
  442. {$ENDIF}
  443. type
  444.   TFormFriend = class(TScrollingWinControl)
  445.   private
  446.     FActiveControl  : TWinControl;
  447.     FFocusedControl : TWinControl;
  448.     FBorderIcons    : TBorderIcons;
  449.     FBorderStyle    : TFormBorderStyle;
  450.     FWindowState    : TWindowState;
  451.   end;
  452.  
  453. procedure TOvcFormState.ReadFormState(Form : TCustomForm;
  454.           const Section : string; LoadState, LoadPosition : Boolean);
  455. const
  456.   Delims = [',', ' '];
  457. var
  458.   Placement : TWindowPlacement;
  459.   WinState  : TWindowState;
  460.   S         : string;
  461. begin
  462.   if not Assigned(FStorage) then
  463.     Exit;
  464.   if not (LoadState or LoadPosition) then
  465.     Exit;
  466.  
  467.   FillChar(Placement, SizeOf(Placement), #0);
  468.   Placement.Length := SizeOf(TWindowPlacement);
  469.   GetWindowPlacement(Form.Handle, @Placement);
  470.   with Placement, TForm(Form) do begin
  471.     ShowCmd := SW_HIDE;
  472.  
  473.     if LoadPosition then begin
  474.       Flags := StrToIntDef(FStorage.ReadString(Section, cFlags, ''), Flags);
  475.       S := FStorage.ReadString(Section, cNormPos, '');
  476.       if S <> '' then begin
  477.         if (Form is TForm) then
  478.           TForm(Form).Position := poDesigned;
  479.         rcNormalPosition.Left := StrToIntDef(ExtractWord(1, S, Delims), Left);
  480.         rcNormalPosition.Top := StrToIntDef(ExtractWord(2, S, Delims), Top);
  481.         rcNormalPosition.Right := StrToIntDef(ExtractWord(3, S, Delims), Left + Width);
  482.         rcNormalPosition.Bottom := StrToIntDef(ExtractWord(4, S, Delims), Top + Height);
  483.  
  484.         if not (BorderStyle in [bsSizeable {$IFDEF WIN32}, bsSizeToolWin {$ENDIF}]) then
  485.           rcNormalPosition := Rect(rcNormalPosition.Left, rcNormalPosition.Top,
  486.             rcNormalPosition.Left + Width, rcNormalPosition.Top + Height);
  487.         if rcNormalPosition.Right > rcNormalPosition.Left then
  488.           SetWindowPlacement(Handle, @Placement);
  489.       end;
  490.     end;
  491.  
  492.     if LoadState then begin
  493.       WinState := wsNormal;
  494.       {default maximize MDI main form}
  495.       if (Application.MainForm = Form) and (FormStyle = fsMDIForm) then
  496.         WinState := wsMaximized;
  497.       ShowCmd := StrToIntDef(FStorage.ReadString(Section, cShowCmd, ''), SW_HIDE);
  498.       case ShowCmd of
  499.         SW_SHOWNORMAL, SW_RESTORE, SW_SHOW : WinState := wsNormal;
  500.         SW_MINIMIZE, SW_SHOWMINIMIZED      : WinState := wsMinimized;
  501.         SW_MAXIMIZE                        : WinState := wsMaximized;
  502.       end;
  503.       {$IFDEF WIN32}
  504.       if (WinState = wsMinimized) and (Form = Application.MainForm) then begin
  505.         TFormFriend(Form).FWindowState := wsNormal;
  506.         PostMessage(Application.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  507.         Exit;
  508.       end;
  509.       {$ENDIF}
  510.       if FormStyle in [fsMDIChild, fsMDIForm] then
  511.         TFormFriend(Form).FWindowState := WinState
  512.       else
  513.         WindowState := WinState;
  514.     end;
  515.  
  516.     {$IFDEF VERSION4}
  517.     if fsDefaultMonitor in Options then begin
  518.       S :=FStorage.ReadString(Section, cMonitor, '');
  519.       if (S > '') then
  520.         try
  521.           DefaultMonitor := TDefaultMonitor(StrToInt(S));
  522.         except
  523.         end;
  524.     end;
  525.     {$ENDIF}
  526.  
  527.     Update;
  528.   end;
  529. end;
  530.  
  531. procedure TOvcFormState.WriteFormState(Form : TCustomForm; const Section : string);
  532. var
  533.   Placement : TWindowPlacement;
  534. begin
  535.   if not Assigned(FStorage) then
  536.     Exit;
  537.  
  538.   Placement.Length := SizeOf(TWindowPlacement);
  539.   GetWindowPlacement(Form.Handle, @Placement);
  540.  
  541.   with Placement, TForm(Form) do begin
  542.     if (Form = Application.MainForm) and IsIconic(Application.Handle) then
  543.       ShowCmd := SW_SHOWMINIMIZED;
  544.     if (FormStyle = fsMDIChild) and (WindowState = wsMinimized) then
  545.       Flags := Flags or WPF_SETMINPOSITION;
  546.     FStorage.WriteString(Section, cFlags, IntToStr(Flags));
  547.     FStorage.WriteString(Section, cShowCmd, IntToStr(ShowCmd));
  548.     FStorage.WriteString(Section, cNormPos, Format('%d,%d,%d,%d',
  549.       [rcNormalPosition.Left, rcNormalPosition.Top, rcNormalPosition.Right,
  550.       rcNormalPosition.Bottom]));
  551.  
  552.     {$IFDEF VERSION4}
  553.     if fsDefaultMonitor in Options then
  554.       FStorage.WriteString(Section, cMonitor, IntToStr(Ord(DefaultMonitor)));
  555.     {$ENDIF}
  556.     
  557.   end;
  558. end;
  559.  
  560. procedure TOvcFormState.RestoreStatePrim;
  561. var
  562.   ActiveCtrl : TComponent;
  563.   S          : string;
  564. begin
  565.   if not Assigned(FStorage) then
  566.     Exit;
  567.  
  568.   FStorage.Open;
  569.   try
  570.     ReadFormState(Form, FSection, fsState in Options, fsPosition in Options);
  571.     if fsActiveControl in Options then begin
  572.       S := FStorage.ReadString(FSection, cActiveCtrl, '');
  573.       ActiveCtrl := Form.FindComponent(S);
  574.       if (ActiveCtrl <> nil) and (ActiveCtrl is TWinControl) and
  575.         TWinControl(ActiveCtrl).CanFocus then
  576.           Form.ActiveControl := TWinControl(ActiveCtrl);
  577.     end;
  578.     UpdateFormState;
  579.   finally
  580.     FStorage.Close;
  581.   end;
  582. end;
  583.  
  584. procedure TOvcFormState.SaveStatePrim;
  585. begin
  586.   if not Assigned(FStorage) then
  587.     Exit;
  588.  
  589.   FStorage.Open;
  590.   try
  591.     WriteFormState(Form, FSection);
  592.     if (fsActiveControl in Options) and (Form.ActiveControl <> nil) then
  593.       FStorage.WriteString(FSection, cActiveCtrl, Form.ActiveControl.Name);
  594.   finally
  595.     FStorage.Close;
  596.   end;
  597. end;
  598.  
  599. procedure TOvcFormState.UpdateFormState;
  600. const
  601.   {$IFDEF WIN32}
  602.   Metrics: array[bsSingle..bsSizeToolWin] of Word =
  603.     (SM_CXBORDER, SM_CXFRAME, SM_CXDLGFRAME, SM_CXBORDER, SM_CXFRAME);
  604.   {$ELSE}
  605.   Metrics: array[bsSingle..bsDialog] of Word =
  606.     (SM_CXBORDER, SM_CXFRAME, SM_CXDLGFRAME);
  607.   {$ENDIF}
  608. var
  609.   Placement : TWindowPlacement;
  610. begin
  611.   if (Owner <> nil) and Form.HandleAllocated and not (csLoading in ComponentState) then begin
  612.     Placement.Length := SizeOf(TWindowPlacement);
  613.     GetWindowPlacement(Form.Handle, @Placement);
  614.     if not IsWindowVisible(Form.Handle) then
  615.       Placement.ShowCmd := SW_HIDE;
  616.     if TForm(Form).BorderStyle <> bsNone then begin
  617.       Placement.ptMaxPosition.X := -GetSystemMetrics(Metrics[TForm(Form).BorderStyle]);
  618.       Placement.ptMaxPosition.Y := -GetSystemMetrics(Metrics[TForm(Form).BorderStyle] + 1);
  619.     end else
  620.       Placement.ptMaxPosition := Point(0, 0);
  621.     SetWindowPlacement(Form.Handle, @Placement);
  622.   end;
  623. end;
  624.  
  625.  
  626. {*** TOvcComponentState ***}
  627.  
  628. constructor TOvcComponentState.Create(AOwner : TComponent);
  629. begin
  630.   inherited Create(AOwner);
  631.  
  632.   FStoredProperties := TStringList.Create;
  633. end;
  634.  
  635. destructor TOvcComponentState.Destroy;
  636. begin
  637.   FStoredProperties.Free;
  638.   FStoredProperties := nil;
  639.  
  640.   inherited Destroy;
  641. end;
  642.  
  643. procedure TOvcComponentState.Loaded;
  644. begin
  645.   inherited Loaded;
  646.  
  647.   UpdateStoredList(Form, FStoredProperties, True);
  648. end;
  649.  
  650. procedure TOvcComponentState.Notification(AComponent : TComponent; Operation : TOperation);
  651. var
  652.   I         : Integer;
  653.   Component : TComponent;
  654. begin
  655.   inherited Notification(AComponent, Operation);
  656.  
  657.   if not (csDestroying in ComponentState) and (Operation = opRemove) and
  658.       (FStoredProperties <> nil) then
  659.     for I := FStoredProperties.Count - 1 downto 0 do begin
  660.       Component := TComponent(FStoredProperties.Objects[I]);
  661.       if Component = AComponent then
  662.         FStoredProperties.Delete(I);
  663.     end;
  664. end;
  665.  
  666. procedure TOvcComponentState.RestoreStatePrim;
  667. begin
  668.   if not Assigned(FStorage) then
  669.     Exit;
  670.  
  671.   isRestored := True;
  672.   with TOvcDataFiler.Create do
  673.   try
  674.     Section := Self.FSection;
  675.     Storage := Self.FStorage;
  676.     FStorage.Open;
  677.     try
  678.       try
  679.         LoadObjectsProps(Form, FStoredProperties);
  680.       except
  681.       end;
  682.     finally
  683.       FStorage.Close;
  684.     end;
  685.   finally
  686.     Free;
  687.   end;
  688. end;
  689.  
  690. procedure TOvcComponentState.SaveStatePrim;
  691. begin
  692.   if not Assigned(FStorage) then
  693.     Exit;
  694.  
  695.   with TOvcDataFiler.Create do
  696.   try
  697.     Section := Self.FSection;
  698.     Storage := Self.FStorage;
  699.     FStorage.Open;
  700.     try
  701.       StoreObjectsProps(Form, FStoredProperties);
  702.     finally
  703.       FStorage.Close;
  704.     end;
  705.   finally
  706.     Free;
  707.   end;
  708. end;
  709.  
  710. procedure TOvcComponentState.SetNotification;
  711. var
  712.   I         : Integer;
  713.   Component : TComponent;
  714. begin
  715.   for I := FStoredProperties.Count - 1 downto 0 do begin
  716.     if FStoredProperties.Objects[I] is TComponent then begin
  717.       Component := TComponent(FStoredProperties.Objects[I]);
  718.       if Component <> nil then
  719.         {$IFDEF WIN32}
  720.         Component.FreeNotification(Self)
  721.         {$ENDIF WIN32};
  722.     end;
  723.   end;
  724. end;
  725.  
  726. procedure TOvcComponentState.SetStoredProperties(Value : TStrings);
  727. begin
  728.   FStoredProperties.Assign(Value);
  729.   SetNotification;
  730. end;
  731.  
  732. procedure TOvcComponentState.WriteState(Writer : TWriter);
  733. begin
  734.   UpdateStoredList(Form, FStoredProperties, False);
  735.  
  736.   inherited WriteState(Writer);
  737. end;
  738.  
  739.  
  740. {*** TOvcPersistentState ***}
  741.  
  742. procedure TOvcPersistentState.Notification(AComponent : TComponent; Operation : TOperation);
  743. begin
  744.   inherited Notification(AComponent, Operation);
  745.  
  746.   if Operation = opRemove then
  747.     if AComponent = FStorage then
  748.       FStorage := nil;
  749. end;
  750.  
  751. procedure TOvcPersistentState.RestoreState(AnObject : TPersistent;
  752.           const ASection : string);
  753. begin
  754.   if not Assigned(FStorage) then
  755.     Exit;
  756.  
  757.   with TOvcDataFiler.Create do
  758.   try
  759.     Section := ASection;
  760.     Storage := Self.FStorage;
  761.     try
  762.       FStorage.Open;
  763.       try
  764.         LoadAllProperties(AnObject);
  765.       finally
  766.         FStorage.Close;
  767.       end;
  768.     except
  769.     end;
  770.   finally
  771.     Free;
  772.   end;
  773. end;
  774.  
  775. procedure TOvcPersistentState.SaveState(AnObject : TPersistent;
  776.           const ASection : string);
  777. begin
  778.   if not Assigned(FStorage) then
  779.     Exit;
  780.  
  781.   with TOvcDataFiler.Create do
  782.   try
  783.     Section := ASection;
  784.     Storage := Self.FStorage;
  785.     FStorage.Open;
  786.     try
  787.       StoreAllProperties(AnObject);
  788.     finally
  789.       FStorage.Close;
  790.     end;
  791.   finally
  792.     Free;
  793.   end;
  794. end;
  795.  
  796. procedure TOvcPersistentState.SetStorage(Value : TOvcAbstractStore);
  797. begin
  798.   FStorage := Value;
  799.   {$IFDEF Win32}
  800.   if Value <> nil then
  801.     Value.FreeNotification(Self);
  802.   {$ENDIF}
  803. end;
  804.  
  805.  
  806.  
  807. end.
  808.